home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 42
/
Amiga Format AFCD42 (Issue 126, Aug 1999).iso
/
-screenplay-
/
shareware
/
scott
/
source
/
source.lha
/
SCOTT.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-04-04
|
18KB
|
895 lines
#include "SCOTT_A.c"
void choice(void)
{
BYTE key;
put_choice();
while (1) {
key = KeyInput();
//printf("Key: %c\n",key);
if (tolower(key) == 'e') {
close_all();
exit(0);
}
if (tolower(key) == 'r') {
cursor(FALSE);
WriteCON("Restore\n");
Speak("Restore");
OutReset();
if (RestoreGame() == FALSE) {
Look();
break;
}
else put_choice();
}
if ((tolower(key) == 's') && RESTART) {
cursor(FALSE);
WriteCON("Restart\n");
Speak("Restart");
OutReset();
if ((LoadRestart() == FALSE) && RESTART) {
Restart();
break;
}
else put_choice();
}
}
}
void SaveBody(FILE *f)
{
int ct;
for(ct=0;ct<16;ct++)
{
fprintf(f,"%d %d\n",Counters[ct],RoomSaved[ct]);
}
fprintf(f,"%ld %d %hd %d %d %hd\n",BitFlags, (BitFlags&(1L<<DARKBIT))?1:0,
MyLoc,CurrentCounter,SavedRoom,GameHeader.LightTime);
for(ct=0;ct<=GameHeader.NumItems;ct++)
fprintf(f,"%hd\n",(short)Items[ct].Location);
fclose(f);
}
void LoadBody(FILE *f)
{
int ct;
short lo;
short DarkFlag;
for(ct=0;ct<16;ct++)
{
fscanf(f,"%d %d\n",&Counters[ct],&RoomSaved[ct]);
}
fscanf(f,"%ld %d %hd %d %d %hd\n",
&BitFlags,&DarkFlag,&MyLoc,&CurrentCounter,&SavedRoom,
&GameHeader.LightTime);
/* Backward compatibility */
if(DarkFlag)
BitFlags|=(1L<<15);
for(ct=0;ct<=GameHeader.NumItems;ct++)
{
fscanf(f,"%hd\n",&lo);
Items[ct].Location=(unsigned char)lo;
}
fclose(f);
}
BOOL SaveRestart()
{
FILE *f;
f = fopen(restart_file,"w");
if (f==NULL) return(TRUE);
SaveBody(f);
//SetProtection(restart_file,128);
restart_lock = Lock(restart_file,SHARED_LOCK);
return(FALSE);
}
BOOL LoadRestart()
{
FILE *f=
f = fopen(restart_file,"r");
if (f==NULL) return(TRUE);
LoadBody(f);
return(FALSE);
}
int PerformLine(int ct)
{
int continuation=0;
int param[5],pptr=0;
int act[4];
int cc=0;
while(cc<5)
{
int cv,dv;
cv=Actions[ct].Condition[cc];
dv=cv/20;
cv=cv%20;
//cv%=20;
switch(cv)
{
case 0:
param[pptr++]=dv;
break;
case 1:
if(Items[dv].Location!=CARRIED)
return(0);
break;
case 2:
if(Items[dv].Location!=MyLoc)
return(0);
break;
case 3:
if(Items[dv].Location!=CARRIED&&
Items[dv].Location!=MyLoc)
return(0);
break;
case 4:
if(MyLoc!=dv)
return(0);
break;
case 5:
if(Items[dv].Location==MyLoc)
return(0);
break;
case 6:
if(Items[dv].Location==CARRIED)
return(0);
break;
case 7:
if(MyLoc==dv)
return(0);
break;
case 8:
if((BitFlags&(1L<<dv))==0)
return(0);
break;
case 9:
if(BitFlags&(1L<<dv))
return(0);
break;
case 10:
if(CountCarried()==0)
return(0);
break;
case 11:
if(CountCarried())
return(0);
break;
case 12:
if(Items[dv].Location==CARRIED||Items[dv].Location==MyLoc)
return(0);
break;
case 13:
if(Items[dv].Location==0)
return(0);
break;
case 14:
if(Items[dv].Location)
return(0);
break;
case 15:
if(CurrentCounter>dv)
return(0);
break;
case 16:
if(CurrentCounter<=dv)
return(0);
break;
case 17:
if(Items[dv].Location!=Items[dv].InitialLoc)
return(0);
break;
case 18:
if(Items[dv].Location==Items[dv].InitialLoc)
return(0);
break;
case 19: /* Only seen in Brian Howarth games so far */
if(CurrentCounter!=dv)
return(0);
break;
}
cc++;
}
/* Actions */
act[0]=Actions[ct].Action[0];
act[2]=Actions[ct].Action[1];
act[1]=act[0]%150;
act[3]=act[2]%150;
act[0]/=150;
act[2]/=150;
cc=0;
pptr=0;
while(cc<4)
{
//printf("Action: %d\n",act[cc]);
if(act[cc]>=1 && act[cc]<52)
{
Output(Messages[act[cc]]);
Speak(Messages[act[cc]]);
Output("\n");
}
else if(act[cc]>101)
{
Output(Messages[act[cc]-50]);
Speak(Messages[act[cc]-50]);
Output("\n");
}
else switch(act[cc])
{
case 0: /* NOP */
break;
case 52:
if(CountCarried()==GameHeader.MaxCarry)
{
if(Options&YOUARE) {
Output("You are carrying too much.\n");
Speak("You are carrying too much.");
}
else {
Output("I've too much to carry!\n");
Speak("I've too much to carry!");
}
break;
}
if(Items[param[pptr]].Location==MyLoc)
Redraw=1;
Items[param[pptr++]].Location= CARRIED;
break;
case 53:
Redraw=1;
Items[param[pptr++]].Location=MyLoc;
break;
case 54:
Redraw=1;
MyLoc=param[pptr++];
break;
case 55:
if(Items[param[pptr]].Location==MyLoc)
Redraw=1;
Items[param[pptr++]].Location=0;
break;
case 56:
BitFlags|=1L<<DARKBIT;
break;
case 57:
BitFlags&=~(1L<<DARKBIT);
break;
case 58:
BitFlags|=(1L<<param[pptr++]);
break;
case 59:
if(Items[param[pptr]].Location==MyLoc)
Redraw=1;
Items[param[pptr++]].Location=0;
break;
case 60:
BitFlags&=~(1L<<param[pptr++]);
break;
case 61:
if(Options&YOUARE) {
Output("You are dead.\n");
Speak("You are dead.");
}
else {
Output("I am dead.\n");
Speak("I am dead.");
}
BitFlags&=~(1L<<DARKBIT);
MyLoc=GameHeader.NumRooms; /* It seems to be what the code says! */
Look();
break;
case 62:
{
/* Bug fix for some systems - before it could get parameters wrong */
int i=param[pptr++];
Items[i].Location=param[pptr++];
Redraw=1;
break;
}
case 63:
doneit: OutBuf("The game is now over!\n");
Speak("The game is now over!");
choice();
break;
case 64:
Look();
break;
case 65:
{
int ct=0;
int n=0;
while(ct<=GameHeader.NumItems)
{
if(Items[ct].Location==GameHeader.TreasureRoom &&
*Items[ct].Text=='*')
n++;
ct++;
}
if(Options&YOUARE) {
Output("You have stored ");
Speak("You have stored ");
}
else {
Output("I've stored ");
Speak("I've stored ");
}
OutputNumber(n);
SpeakNum(n);
Output("treasures.\nOn a scale of 0 to 100, that scores ");
Speak("treasures. On a scale of 0 to hundred that scores ");
OutputNumber((n*100)/GameHeader.Treasures);
SpeakNum((n*100)/GameHeader.Treasures);
Output("points.\n");
Speak("points.");
if(n==GameHeader.Treasures)
{
Output("Well done.\n");
Speak("Well done.");
goto doneit;
}
break;
}
case 66:
{
int ct=0;
int f=0;
if(Options&YOUARE) {
Output("You are carrying:\n");
Speak("You are carrying:");
}
else {
Output("I'm carrying:\n");
Speak("I'm carrying:");
}
while(ct<=GameHeader.NumItems)
{
if(Items[ct].Location==CARRIED)
{
if(f==1)
{
if (Options & TRS80_STYLE)
Output(". ");
else
Output(" - ");
}
f=1;
Output(Items[ct].Text);
Speak(Items[ct].Text);
}
ct++;
}
if(f==0) {
Output("Nothing");
Speak("Nothing");
}
Output(".\n");
break;
}
case 67:
BitFlags|=(1L<<0);
break;
case 68:
BitFlags&=~(1L<<0);
break;
case 69:
GameHeader.LightTime=LightRefill;
if(Items[LIGHT_SOURCE].Location==MyLoc)
Redraw=1;
Items[LIGHT_SOURCE].Location=CARRIED;
BitFlags&=~(1L<<LIGHTOUTBIT);
break;
case 70:
clrscr(); /* pdd. */
OutReset();
break;
case 71:
SaveGame();
break;
case 72:
{
int i1=param[pptr++];
int i2=param[pptr++];
int t=Items[i1].Location;
if(t==MyLoc || Items[i2].Location==MyLoc)
Redraw=1;
Items[i1].Location=Items[i2].Location;
Items[i2].Location=t;
break;
}
case 73:
continuation=1;
break;
case 74:
if(Items[param[pptr]].Location==MyLoc)
Redraw=1;
Items[param[pptr++]].Location= CARRIED;
break;
case 75:
{
int i1,i2;
i1=param[pptr++];
i2=param[pptr++];
if(Items[i1].Location==MyLoc)
Redraw=1;
Items[i1].Location=Items[i2].Location;
if(Items[i2].Location==MyLoc)
Redraw=1;
break;
}
case 76: /* Looking at adventure .. */
Look();
break;
case 77:
if(CurrentCounter>=0)
CurrentCo